package jhlee42;

import java.io.ObjectInputStream.GetField;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;

import jhlee42.model.SungJuk2VO;

public class J20SungJuk {
	
	// NumberFormat
	// DecimalFormat
	// format 메서드에 특정패턴(0,#)을 이용해서
	// 다양한 형식으로 숫자를 출력할 수 있음.
	
	public static void main(String[] args) {
		ArrayList<SungJuk2VO>mdb = new ArrayList<>(); // mdb 에 저장이 된다..
		
		String dfmt1 = "000.00"; // 형식을 정해준다. // 다른걸로 지정해보자!!!!!!!!!!1
		String dfmt2 = "###.##";

		String hr ="---------------------------------";
		String newMsg1="새로운 성적데이터를 입력합니다.";
		String newMsg2="이름 국어 영어 수학 순으로 입력하세요.";
		String newMsg3="성적 등록 완료!";
		String newMsg4="성적 등록 실패!-숫자만 입력하세요.";
		String newMsg5="성적 등록 실패!-알 수 없는 오류발생!";

		
		String readMsg1 = "전체 성적데이터 출력";
		String readMsg2 = "검색할 성적데이터의 이름을 ";
		String readMsg3 = "데이터를 찾았습니다.";
		String readMsg4 = "찾는 데이터가 없습니다.";
		
		String modifyMsg1="기존 성적데이터를 수정합니다.";
		String modifyMsg2="수정할 데이터의 이름을 입력하세요.";
		String modifyMsg3="이름 국어 영어 수학 순으로 입력하세요";
		String modifyMsg4="수정 결과는 다음과 같습니다.";
		String modifyMsg5="찾는 데이터가 없어요.";


		String removeMsg1 ="성적 데이터를 삭제합니다.";
		String removeMsg2 ="삭제할 성적 데이터의 이름을 입력하세요.";
		String removeMsg3 ="성공적으로 삭제되었습니다.";
		String removeMsg4 ="삭제할 데이터를 찾지 못했습니다.";

		

		// 성적 데이터 입력 create
		Scanner sc = new Scanner(System.in);
		SungJuk2VO sj = null;
		System.out.println(newMsg1);
		System.out.println(newMsg2);
		
		try{ // 정상 처리하는 곳 까지 묶기..
			String name = sc.next(); // 이름 입력
			int kor = sc.nextInt();  // 국어 입력 
			int eng = sc.nextInt();  // 영어 입력
			int mat = sc.nextInt();  // 수학 입력
			sj = new SungJuk2VO(name, kor, eng, mat); // 생성자 
			
			// 계산 하려고..
			sj.setTot(sj.getKor()+sj.getEng()+sj.getMat());
			
			DecimalFormat df = new DecimalFormat(dfmt1);  // df 객체에...  형식을 정해주려고
			String avg = df.format((double)sj.getTot()/3);
			
			sj.setAvg(Double.parseDouble(avg));
			
			switch ((int)sj.getAvg()/10) {
			case 10:	
			case 9:	sj.setGrd('수'); break;
			case 8:	sj.setGrd('우'); break;
			case 7:	sj.setGrd('미'); break;
			case 6:	sj.setGrd('양'); break;
			default: sj.setGrd('가'); break;
			}			
			
			mdb.add(sj); // arrayList에 데이터 추가 !! 벡터에 데이터 추가시 add
			
			System.out.println(newMsg3);
		} catch (InputMismatchException ime){
			sj = null; // 객체 제거
			System.out.println(newMsg4);
		} catch (Exception e){
			e.printStackTrace(); // 자세한 오류내용 출력
			System.out.println(newMsg5);
		}
		System.out.println(hr);
		
		// 성적 데이터 조회 retrieve
		//String readMsg1 ="전체 성적데이터 출력";
		StringBuilder sb = new StringBuilder();  // StringBuilder .. 왜 쓰는 중 tostring(메모리가...많이.) 대신에 
		for (SungJuk2VO s : mdb) {
			sb.append(s.toString()).append("\n"); // 받아와서 쓰기...
		}
		
		System.out.println(sb);
		System.out.println(hr);
		
		// 성적 데이터 검색
		System.out.println(readMsg2);
		String key = sc.next(); // 검색 데이터 대상의 이름 입력 받음
		SungJuk2VO findOne = null;
		for (SungJuk2VO s : mdb) {
			if(s.getName().contains(key)){
				findOne = s; // 검색된 데이터를 findOne에 저장
			} // if 조건문이 true 이면...
			break;
		} // for 
		if (findOne != null) {
			System.out.println(readMsg3);
			System.out.println(findOne);
		} else {
			System.out.println(readMsg4);
		}
		
		
		
		// 성적 데이터 수정 update
		System.out.println(modifyMsg1);
		System.out.println(modifyMsg2);
		key = sc.next();
		findOne = null;
		int position = 0;
		for(SungJuk2VO s:mdb){
			if(s.getName().equals(key)){
				findOne = s; break;
			} // if
			++position; // 위치값.... 수정하기 set(위치,값)
		} // for
		if (findOne != null) {
			System.out.println(modifyMsg3);
			findOne = new SungJuk2VO(sc.next(), sc.nextInt(), sc.nextInt(), sc.nextInt());
				
			// 계산 하려고..
			/*************************************************************/
			findOne.setTot(findOne.getKor()+findOne.getEng()+findOne.getMat());
				
				DecimalFormat df = new DecimalFormat(dfmt1);  // ???????????????????????
				String avg = df.format((double)findOne.getTot()/3);
				
				findOne.setAvg(Double.parseDouble(avg));
				
				switch ((int)findOne.getAvg()/10) {
				case 10:	
				case 9:	findOne.setGrd('수'); break;
				case 8:	findOne.setGrd('우'); break;
				case 7:	findOne.setGrd('미'); break;
				case 6:	findOne.setGrd('양'); break;
				default: findOne.setGrd('가'); break;
				}
			/*************************************************************/
			mdb.set(position, findOne);
			
			System.out.println(modifyMsg4);
			System.out.println(mdb.get(position));

		} else {
			System.out.println(modifyMsg5);
		}
		System.out.println(hr);
		
		// 성적 데이터 삭제 delete
		System.out.println(removeMsg1);
		System.out.println(removeMsg2);
		key=sc.next();
		boolean findOK = false;
		
		
		
		/* for each 문의 숨겨져 있는 의미 */
		position = 0 ; 
		for (int i = 0; i < mdb.size(); ++i) {
			SungJuk2VO s = mdb.get(i); // ********************
			if (s.getName().equals(key)) {
				findOK = true;
				position = i;  // ********************
				break;
			}
		} // for 문
		
		if (findOK){
			mdb.remove(position);
			System.out.println(removeMsg3);
			sb = new StringBuilder();
			
			for (SungJuk2VO s : mdb) {
				sb.append(s.toString()).append("/n");			
			}	
		}else{
			System.out.println(removeMsg4);
		}
		
		
		
	} // main

} // class






















